package com.shujia.base.day02

/**
 * 函数A作为函数B的返回值进行返回
 */
object Demo15Function {
  def main(args: Array[String]): Unit = {

    //定义一个函数,返回值是一个参数为字符串,返回值类型是Int的函数
    //定义方式1:
//    def fun1(s1: String): String => Int = {
//      def show(s2: String): Int = {
//        s1.toInt + s2.toInt + 100
//      }
//      show
//    }

    //定义方式2:

    /**
     *  函数柯里化
     *  柯里化:本身的含义来自于数学界的一个说法,值得是一个公式中将原来一次传多值的方式转变成分开传递的方式.
     *
     *  这种柯里化的思想在scala中函数作为函数的返回值中体现了, 在Scala中称之为函数柯里化.
     *
     */
//    def fun1(s1:String)(s2:String):Int={
//      s1.toInt + s2.toInt + 100
//    }

    //调用fun1函数
//    val stringToInt: String => Int = fun1("100")
//    val number:Int = stringToInt("200")
//    println(number)

    //调用方式2:
//   val number:Int = fun1("100")("200")
//    println(number)

//    val stringToInt: String => Int = fun1("100")
//    println(stringToInt("200")) // 400
//    println(stringToInt("300")) // 500
//    println(stringToInt("400")) // 600

    def fun2(s1:String,s2:String):Int={
      s1.toInt + s2.toInt + 100
    }
//    println(fun2("100","200"))

    /**
     *  若函数定义的时候,就已经是将多个参数定义在一个列表中,且调用时也想达到分开传递参数的效果的话,
     *  scala提供了另一个技术:偏函数,自动生成一个函数,这个是由调用方式不同生成的
     */
//    val number:Int = fun2("100", "200")
//    println(number)

    val stringToInt:String=>Int = fun2("100", _)
    println(stringToInt("11"))
    println(stringToInt("22"))
    println(stringToInt("33"))
    println(stringToInt("44"))







  }
}
